package demo;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 提取文件
 */
public class Extractor {
    public List<String> extractStringsFromFile(String filePath) {
        List<String> extractedStrings = new ArrayList<>();
        StringBuilder currentString = new StringBuilder();
        State currentState = State.INITIAL;

        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            int ch;
            while ((ch = reader.read()) != -1) {
                char currentChar = (char) ch;

                switch (currentState) {
                    case INITIAL:
                        if (currentChar == '"') {
                            currentState = State.STRING;
                            currentString = new StringBuilder();
                        }
                        break;
                    case STRING:
                        if (currentChar == '\\') {
                            currentState = State.ESCAPE;
                        } else if (currentChar == '"') {
                            extractedStrings.add(currentString.toString());
                            currentState = State.INITIAL;
                        } else {
                            currentString.append(currentChar);
                        }
                        break;
                    case ESCAPE:
                        currentString.append(currentChar);
                        currentState = State.STRING;
                        break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return extractedStrings;
    }
}
/**
 * 状态机处理：
 *
 * 使用一个 switch 语句来处理不同的状态。
 * 初始状态 (INITIAL)：
 * 如果当前字符是双引号 "，则进入 STRING 状态，并开始构建新的字符串。
 * 字符串状态 (STRING)：
 * 如果当前字符是反斜杠 \，则进入 ESCAPE 状态，表示下一个字符是转义字符。
 * 如果当前字符是双引号 "，则表示当前字符串结束，将其添加到 extractedStrings 列表中，并重置 currentString，然后进入 INITIAL 状态。
 * 如果当前字符不是上述两种情况，则将其添加到 currentString 中。
 * 转义字符状态 (ESCAPE)：
 * 将当前字符添加到 currentString 中，然后进入 STRING 状态，继续处理下一个字符。
 */